.TH std::integral_constant 3 "2024.06.10" "http://cppreference.com" "C++ Standard Libary"
.SH NAME
std::integral_constant \- std::integral_constant

.SH Synopsis
   Defined in header <type_traits>
   template< class T, T v >         \fI(since C++11)\fP
   struct integral_constant;

   std::integral_constant wraps a static constant of specified type. It is the base
   class for the C++ type traits.

   If the program adds specializations for std::integral_constant, the behavior is
   undefined.

.SH Specializations

   Two typedefs for the common case where T is bool are provided:

   Defined in header <type_traits>
   Name       Definition
   true_type  std::integral_constant<bool, true>
   false_type std::integral_constant<bool, false>

   Nested types

   Name       Definition
   value_type T
   type       std::integral_constant<T, v>

.SH Member constants

   Name              Value
   constexpr T value v
   \fB[static]\fP          \fI(public static member constant)\fP

.SH Member functions

   operator value_type returns the wrapped value
                       \fI(public member function)\fP
   operator()          returns the wrapped value
   \fI(C++14)\fP             \fI(public member function)\fP

std::integral_constant::operator value_type

   constexpr operator value_type() const noexcept;

   Conversion function. Returns the wrapped value.

std::integral_constant::operator()

   constexpr value_type operator()() const noexcept;  \fI(since C++14)\fP

   Returns the wrapped value. This function enables std::integral_constant to serve as
   a source of compile-time function objects.

.SH Possible implementation

   template<class T, T v>
   struct integral_constant
   {
       static constexpr T value = v;
       using value_type = T;
       using type = integral_constant; // using injected-class-name
       constexpr operator value_type() const noexcept { return value; }
       constexpr value_type operator()() const noexcept { return value; } // since c++14
   };

.SH Notes

            Feature-test macro           Value    Std                Feature
   __cpp_lib_integral_constant_callable 201304L \fI(C++14)\fP std::integral_constant::operator()
   __cpp_lib_bool_constant              201505L \fI(C++17)\fP std::bool_constant

.SH Example


// Run this code

 #include <type_traits>

 using two_t = std::integral_constant<int, 2>;
 using four_t = std::integral_constant<int, 4>;

 static_assert(not std::is_same_v<two_t, four_t>);
 static_assert(two_t::value * 2 == four_t::value, "2*2 != 4");
 static_assert(two_t() << 1 == four_t() >> 0, "2*2 != 4");

 enum class E{ e1, e2 };
 using c1 = std::integral_constant<E, E::e1>;
 using c2 = std::integral_constant<E, E::e2>;
 static_assert(c1::value != E::e2);
 static_assert(c1() == E::e1);
 static_assert(std::is_same_v<c2, c2>);

 int main() {}

.SH See also

   integer_sequence implements compile-time sequence of integers
   \fI(C++14)\fP          \fI(class template)\fP
